home *** CD-ROM | disk | FTP | other *** search
/ TPUG - Toronto PET Users Group / TPUG Users Group CD / TPUG Users Group CD.iso / PET / S-Super PET / (s)tl.d64 / NSCROLL.ASM < prev    next >
Assembly Source File  |  2009-01-18  |  6KB  |  224 lines

  1. ; 'nscroll' -- reconstructed from binary by T.M. Peterson
  2. ;                        6/19/83
  3.  
  4. ;  Altered 7/01/83 for better print & serial buffering
  5.  
  6. ;    "     7/06/83 for warm start after accid. lang. exit
  7.  
  8. ;    "     7/10/83 for STOP during RVS pause
  9.  
  10. ;  Rewritten as required to be completely relocatable without re-assembly
  11.  
  12.         xdef   byt_get  ;routine to hand byte to BASIC/??
  13.  
  14.         xref   TGetCurs_,Openf_,Closef_,FPutRec_,FPutNL_,Printf_
  15.  
  16. byt_buf   equ  $FF      ;put rcv'd byte here on request
  17.  
  18. begin equ  *            ;setup IRQ vector
  19.       leax scrol,pc     ;get new vector
  20.       cmpx $0108        ;test current vector
  21.       if   ne           ;not already changed
  22.         ldd  $0108      ;get old
  23.         STD  oldvec,pc  ;save it
  24.         STX  $0108      ;alter current vector
  25.       endif
  26.       dex
  27.       stx  $22          ;keep from over-writing
  28.  
  29.       leax   beg_buf,pc ;init. buffer pointers
  30.       stx    i_ptr,pc
  31.       stx    o_ptr,pc
  32.  
  33.       leax hello,pc
  34.       tfr  x,d
  35.       leax byt_get,pc
  36.       pshs x
  37.       jsr  printf_
  38.       leas 2,s
  39.  
  40.       CLR  $32          ;flag done
  41.       RTS
  42.  
  43. hello fcc  "NScroll -- Version 8/28/83"
  44.       fcb  $D
  45.       fcc  "Now Activated."
  46.       fcb  $D,$D
  47.       fcc  "(Test for buffered char. from 'serial' with 'sys %d'.)"
  48.       fcb  $D,0
  49.  
  50. scrol LDD  $012e        ;save keybuf index
  51.       PSHS d
  52.       lda  $EFF1        ;did ACIA call us?
  53.       if   mi           ;(yes)
  54.         anda buf_nable,pc ;have Rxd?
  55.         if  ne          ;(yes)
  56.           lbsr  buf_byt ;go put in buffer
  57.         endif
  58.       else
  59.         JSR    [oldvec,pc] ;go do 1st lev. IRQ
  60.         BSR    tstRVSky
  61.         BEQ    scro9    ;not RVS
  62.         TST    busyflg,pc ;already handling?
  63.         BNE    scro9    ;yes, never mind
  64.         DEC    busyflg,pc ;flag busy
  65.         LDX    ,S       ;retr. kybf indx
  66.         LDA    #$ff     ;test last keystroke
  67.         CMPA   ,X       ;was it RVS?
  68.         if     eq
  69.           STX  $012e    ;undo RVS keystroke
  70.         endif
  71.         BSR    keytst   ;test for halt/print
  72.         CLR    busyflg,pc ;not busy anymore
  73.       endif
  74. scro9 LEAS   2,S      ;clr stack
  75.       RTS
  76.  
  77. keytst BSR  tstSHFT     ;shift key dn?
  78.      if   ne            ; NE ==> yes
  79.        BSR  openfl      ;go do dump
  80.      endif
  81.       BSR  tstRVSky     ;RVS still dn?
  82.       BNE  keytst       ;yes, loop
  83.      loop
  84.       bsr  tstSTOP      ;Test for STOP
  85.       if   ne           ;Yes, but
  86.         bsr tstSHFT     ;is it really RUN?
  87.         if  ne          ;Yes, do warm start
  88.           leas  2,s     ;Dump RTS addrs.
  89.           clr   busyflg,pc
  90.           jmp   [$10C]  ;Treat like NMI
  91.         else
  92.           rts           ;no, do STOP
  93.         endif
  94.       endif
  95.       BSR  tstRVSky     ;wait for 2nd RVS
  96.      until ne
  97.       BSR  tstSHFT
  98.       BNE  keytst       ;shifted--do dump
  99.      loop
  100.       BSR  tstRVSky     ;wait for not RVS
  101.      until eq
  102.       RTS
  103.  
  104. ;       Test for STOP key: row 9, bit 4
  105. ;       CC(Z)=1 if not stop
  106.  
  107. tstSTOP ldd #$910
  108.         bra tstIT
  109.  
  110. ;       Since RVS key clears b0 of row 8,
  111. ;       test it. RTS with CC(Z)=1 if NOT RVS.
  112.  
  113. tstRVSky ldd  #$801     ;select row 8, bit 0
  114.          bra tstIT
  115.  
  116. ;       Ditto for SHIFT keys. CC(Z)=1 if
  117. ;       neither key is down.
  118.  
  119. tstSHFT ldd  #$641      ;sel. row 6, bits 6&0
  120.  
  121. tstIT   pshs b
  122.         sei
  123.         STA  $e810      ;sel. row
  124.         andb $e812      ;mask bit(s)
  125.         cli
  126.         cmpb ,s         ;all set?
  127.         leas 1,s        ;clr stk
  128.         RTS             ;Z=1 means bit(s) set
  129.  
  130. fltype  fcc "W"
  131.         fcb 0
  132. flname  fcc "ieee4"     ; substitute 'printer' or 'serial' as needed
  133.         fcb 00,00,00
  134.  
  135. openfl leax fltype,pc
  136.       pshs x
  137.       leax flname,pc
  138.       tfr  x,d
  139.       JSR  Openf_       ;go open it
  140.       LEAS 2,S
  141.       BNE  prnt         ;open successful
  142.       RTS
  143.  
  144. prnt  LEAS -4,S         ;res some stack space
  145.       STD  $02,S        ;save cntrl blk
  146.       JSR  FPutNL_
  147.       LDX  #$8000       ;start at CRT beg.
  148.  
  149. prnt1 STX  ,S           ;save pntr
  150.       LDB  #79          ;max 80 chars/line
  151.       LDA  #$20         ;space
  152.     loop
  153.       CMPA B,X          ;look for eol
  154.       quif ne           ;here it is
  155.       DECB              ;to beg. of line?
  156.     until  mi
  157.       CLRA
  158.       INCB              ;adj. count
  159.       PSHS d
  160.       PSHS x
  161.       LDD  $06,S        ;get cntrl blk ptr
  162.       JSR  FPutRec_     ;print#P1, (P2).(P3)
  163.       LEAS 4,S          ;clean stack
  164.       bsr  tstSTOP      ;test for STOP
  165.       bne  prnt2
  166.       LDX  ,S           ;get pntr back
  167.       LEAX 80,X         ;bump to nxt line
  168.       tfr  x,d          ;make copy
  169.       anda #$7f         ;strip CRT offset
  170.       cmpd $122         ;back to crsr?
  171.       blo  prnt1        ;no, loop
  172.  
  173. prnt2 LDD  $02,S        ;close file
  174.       JSR  Closef_
  175.       LEAS 4,S          ;release stk space
  176.       RTS
  177.  
  178. buf_byt equ     *       ;buffer rec'd data
  179.         lda     $EFF0   ;get byte
  180.         ldx     i_ptr,pc
  181.         sta     ,x+
  182.         bsr     end_chk ;chk for over-run
  183.         stx     i_ptr,pc
  184.         rts
  185.  
  186. ; The following byte is used to turn on/off the 'serial' buffering
  187. ; facility. You might wish to turn it off while in 'passthru' for
  188. ; example. When nscroll is booted the buffer is ON.
  189.  
  190. ; N.B.: buf_nable = byt_get - 1  (Addrs. of byt_get printed at boot-up)
  191.  
  192. buf_nable fcb   8       ;'8'= buffer enabled, '0'= disabled.
  193.  
  194. byt_get equ     *       ;fetch byte from buffer
  195.         clr     byt_buf-1       ;preset no-byte
  196.         ldx     o_ptr,pc
  197.         cmpx    i_ptr,pc
  198.         if      ne
  199.           inc   byt_buf-1   ;flg byte pres.
  200.           lda   ,x+         ;get byte, put
  201.           sta   byt_buf     ;where BASIC can find
  202.           bsr   end_chk     ;over-run buffer?
  203.           stx   o_ptr,pc    ;update ptr.
  204.         endif
  205.         rts
  206.  
  207. end_chk equ     *
  208.         cmpx    #end_buf    ;over-run buffer?
  209.         if      eq          ;yes, reset
  210.           leax  beg_buf,pc
  211.         endif
  212.         rts
  213.  
  214. i_ptr   rmb 2
  215. o_ptr   rmb 2
  216.  
  217. busyflg fcb 0
  218. oldvec  rmb 2
  219.  
  220. beg_buf equ     *       ;use here to CRT for buffer
  221. end_buf equ     $7FFF
  222.  
  223.         end
  224.